package com.apes.framework.query;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.hibernate.SQLQuery;
import org.hibernate.transform.Transformers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
import java.util.Map;

@Component
public class ApesDao {

    @Autowired
    EntityManager em;

    @Autowired
    SqlService sqlService;

    /***
     * 功能: hibenate 查询
     * 场景: 简单查询, 字段少别名(部分需要手动转义,例如: NVARCHAR2类型 以及 Blob类型需使用 to_char 转义)
     * @param sql
     * @return
     */
    protected List<Map> find(String sql){

        return find(sql, null) ;
    }

    protected List<Map> find(String sql, Map<String, Object> params){
        Query query = em.createNativeQuery(sql);
        // Query 接口是 spring-data-jpa 的接口，而 SQLQuery 接口是 hibenate 的接口，这里的做法就是先转成 hibenate 的查询接口对象，然后设置结果转换器

        query.getParameters().stream().forEach(param -> {
            query.setParameter(param.getName(), params.get(param.getName()));
        });

        query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        return query.getResultList();
    }


    protected int update(String sql, Map<String, Object> params){
        Query query = em.createNativeQuery(sql);

        query.getParameters().stream().forEach(param -> {
            query.setParameter(param.getName(), params.get(param.getName()));
        });

        return query.executeUpdate();
    }

    protected int insert(String sql, Map<String, Object> params){
        Query query = em.createNativeQuery(sql);

        query.getParameters().stream().forEach(param -> {
            query.setParameter(param.getName(), params.get(param.getName()));
        });

        return query.executeUpdate();
    }

    protected int delete(String sql, Map<String, Object> params){
        Query query = em.createNativeQuery(sql);

        query.getParameters().stream().forEach(param -> {
            query.setParameter(param.getName(), params.get(param.getName()));
        });

        return query.executeUpdate();
    }


    /***
     * 功能: mybatis 查询
     * 场景: 字段多别名, 需根据条件拼接sql
     * @param sql
     * @return
     */
    protected JSONArray query(String sql){
        return new JSONArray(sqlService.query(sql));
    }

    protected JSONArray query(String sql, Map<String, Object> params){
        com.apestech.framework.json.JSONObject param = new com.apestech.framework.json.JSONObject(params);
        return new JSONArray(sqlService.query(sql, param));
    }

    protected JSONArray queryId(String queryid, Map<String, Object> params){
        com.apestech.framework.json.JSONObject param = new com.apestech.framework.json.JSONObject(params);
        return new JSONArray(sqlService.queryId(queryid, param));
    }


    /***
     * 功能： 用于处理返回值
     * @param lists
     * @return
     */
    protected JSONArray toJSONArray(List<Map> lists) {
        JSONArray returnArr = new JSONArray();
        lists.stream().forEach(list -> returnArr.add(new JSONObject(list)));
        return returnArr;
    }

}
